#include "mainwindow.h"
#include "CompilerSet.h"
#include "globalvar.h"

//向主窗口的localserver发送信息
void sendMessage(QString str)
{
    QLocalSocket *socket = new QLocalSocket();
    for (int j = 1; j <= 30; j++)
    {
        socket->connectToServer(QString("Cute_CPP"), QIODevice::ReadWrite);
        bool connected = socket->waitForConnected(5000); //尝试连接LocalServer，最多等待5秒时间
        if (connected)
        {
            QTextStream stream(socket);
            stream.setEncoding(QStringConverter::Utf8);
            stream << str;
            stream.flush();
            socket->waitForBytesWritten(5000);  //信息传输，最多等待5秒时间
            break;
        }

        QThread::msleep(QRandomGenerator::global()->bounded(100, 300));	//随机化等待时间。无法连接server时，等待100~300毫秒再尝试接入。
    }
}

int main(int argc, char *argv[])
{
    QApplication::setStyle(QStyleFactory::create("fusion"));//fusion,windowsvista,windows，默认windowsvista，windows风格是古老机械风。
    QApplication app(argc, argv);
    app.setApplicationName("Cute_CPP");
    app.setFont(QFont(QStringList{"Arial", "Microsoft Yahei"}, 11));

    qRegisterMetaType<CompilerSet>("CompilerSet");
    qRegisterMetaType<QList<CompilerSet>>("QList<CompilerSet>");
    qRegisterMetaType<QList<int>>("QList<int>");
    qRegisterMetaType<QList<QColor>>("QList<QColor>");

    QStringList args = QApplication::arguments(); //程序启动时接收的参数列表
    //创建以程序名为名称的共享内存，保证只有一个app在运行。
    QSharedMemory sharedMemory("Cute_CPP");
    if (!sharedMemory.create(1)) //创建共享内存，如果该共享内存已存在，说明已有程序在运行，向此程序发送媒体文件名信息，然后退出。
    {
        if (args.size() <= 1)
        {
            sendMessage("NoParameter");
            return 1; //返回1，退出运行。
        }

        QString fileNamesString;
        for (int i = 1; i < args.size(); i++)
        {
            fileNamesString += (QDir::fromNativeSeparators(args.at(i)) + '\n'); // "\\"转为"/"
        }

        sendMessage(fileNamesString);
        return 1; //返回1，退出运行。
    }

    //从设置文件Setting.ini中读取上次窗口关闭时的尺寸和状态
    QString appDataPath = QStandardPaths::writableLocation(QStandardPaths::AppConfigLocation);
    QSettings setting(appDataPath + "/Setting.ini", QSettings::IniFormat);
    QString language = setting.value("Language", "Chinese").toString(); //获取上次的菜单显示语言
    if (language == "Chinese"&&GlobalVar::translator->load(":Cute-CPP_zh_CN.qm"))
    {
        app.installTranslator(GlobalVar::translator);
    }

    //创建主程序窗口，如果有参数传入，打开相应代码文件，否则打开空标签页
    MainWindow mainWindow;
    if (args.size() > 1)
    {
        for (int i = 1; i < args.size(); i++)
        {
            mainWindow.openSpecifiedFile(QDir::fromNativeSeparators(args[i])); // "\\"转为"/"
        }
    }
    else
    {
        mainWindow.addEditorTab("Untitled1");
    }

    if (mainWindow.getLastWindowState() == Qt::WindowMaximized||(mainWindow.getLastWindowState()&Qt::WindowFullScreen)==Qt::WindowFullScreen)
        mainWindow.showMaximized();
    else
        mainWindow.showNormal();

    return app.exec();
}
